# coding=utf-8
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import viewsets
from django.db.models import Q
from rest_framework.decorators import action
from MSB_ERP.utils.pagination import GlobalPagination
from MSB_ERP.utils.base_views import MultipleOpenMixin, MultipleDestoryMixin
from goods_info.models import UnitsModel
from goods_info.serializer.units_serializer import UnitsSerializer


class UnitsView(viewsets.ModelViewSet, MultipleDestoryMixin,MultipleOpenMixin):
    """
    create:
    计量单位类别信息--新增

    计量单位类别信息新增, status: 201(成功), return: 新增计量单位类别信息信息

    destroy:
    计量单位类别信息--删除

    计量单位类别信息删除, status: 204(成功), return: None

    multiple_delete:
    计量单位类别信息--批量删除,必传json参数：ids=[1,2,3,4...]

    计量单位类别信息批量删除, status: 204(成功), return: None

    multiple_open:
    计量单位类别信息--批量启用或者禁用,必传(json)参数：ids=[1,2,3,4...](列表中可以只有一个)，is_open=1/0

    {
        "ids":[1,2],
        "is_open":"0"
    }
    is_open=1表示禁用，is_open=0表示启用，
    计量单位类别信息批量启用或者禁用, status: 204(成功), return: None

    update:
    计量单位类别信息--修改,一般用于修改多个属性

    计量单位类别信息修改, status: 200(成功), return: 修改后的计量单位类别信息信息

    partial_update:
    计量单位类别信息--局部修改(一般修改一个属性),可以传参任意属性的值，服务器会修改指定的属性值

    计量单位类别信息局部修改, status: 200(成功), return: 修改后的计量单位类别信息信息

    list:
    计量单位类别信息，可以不要

    计量单位类别信息列表信息, status: 200(成功), return: 计量单位类别信息信息列表

    retrieve:
    查询某一个计量单位类别信息

    查询指定ID的计量单位类别信息, status: 200(成功), return: 用户计量单位类别信息
    """

    queryset = UnitsModel.objects.all()
    serializer_class = UnitsSerializer
    # pagination_class = GlobalPagination

    def get_queryset(self):
        if self.action == 'find':  # 过滤查询
            # 获得请求参数（在get中）：keyword
            keyword = self.request.data.get('name', None)
            # 同时搜索基本单位名称和服单位名称
            query = Q()
            if keyword:
                # 关键字查询两个字段
                query.add(Q(basic_name__contains=keyword), "OR"),  # 多条件进行组合
                query.add(Q(backup_name__contains=keyword), "OR"),

                return UnitsModel.objects.filter(query).all()
        else:
            return UnitsModel.objects.all()

    json__params = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
        # 参数名：接一个类型（类型一个是openapi.Schema开头的）
        # 因为他是整数，所以要openapi.TYPE_INTEGER整数类型
        'name': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING),
                               description='计量单位的名称关键字'),
    })

    # 这个是特别的接口文档，methods表示请求的方法，request_body表示指定传参
    # 注意点位：在swagger文档中如果用get请求他是不给你使用request_body，只有在post，delete，put，patch请求中才可以使用request_body
    # request_body就是JSON格式的传参
    @swagger_auto_schema(method='post', request_body=json__params,
                         operation_description='计量单位的过滤查询')  # 装饰器一定要写在action的上面
    @action(methods=['post'], detail=False)
    def find(self, request, *args, **kwargs):
        # 用于调用父类（超类）的方法。它提供了一种方便的方式来调用父类的方法，而不需要显式地指定父类的名称。
        # list函数是父类里面的函数（他是drf框架本身的代码）
        return super(UnitsView, self).list(request=request, *args, **kwargs)
